// 坦克大战（最终版）
//两种界面

//package TankGame;
//
//// 该类是整个坦克大战游戏的主框架，继承自JFrame
//// 用于创建游戏窗口、管理游戏面板和处理游戏的开始、结束逻辑。
//// 主要用到了 Swing 图形界面编程的知识。
//
//import javax.swing.*;
//import java.awt.*;
//import java.awt.event.ActionEvent;
//import java.awt.event.ActionListener;
//import java.awt.event.WindowAdapter;
//import java.awt.event.WindowEvent;
//
//
//// TankGame类是游戏的主窗口，负责初始化和管理游戏的各个组件以及游戏流程
//public class TankGame extends JFrame {
//    private JPanel startPanel;
//    private GamePanel gamePanel;
//    private boolean isGameOver;
//    private JButton saveButton;
//    private JButton loadButton;
//    private JPanel buttonPanel;// 声明 buttonPanel ,用于保存和加载按钮的容器
//
//    // 构造函数，用于初始化游戏窗口的基本属性和创建开始面板与游戏面板
//    public TankGame() {
//        // 设置窗口标题为"坦克大战"
//        setTitle("坦克大战");
//        // 设置窗口大小为800x600像素
//        setSize(800, 600);
//        // 设置窗口关闭操作，点击关闭按钮时退出程序
//        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        // 使窗口在屏幕中居中显示
//        setLocationRelativeTo(null);
//        // 设置窗口大小不可调整
//        setResizable(false);
//
//        // 创建开始面板，并将当前的TankGame实例传入
//        startPanel = new StartPanel(this);
//        // 创建游戏面板，并将当前的TankGame实例传入
//        gamePanel = new GamePanel(this);
//        // 初始化游戏结束标志为false
//        isGameOver = false;
//
//        // 将开始面板设置为窗口的内容面板
//        setContentPane(startPanel);
//        // 使窗口可见
//        setVisible(true);
//
//        // 添加窗口监听器，当窗口关闭时执行特定操作
//        addWindowListener(new WindowAdapter() {
//            @Override
//            public void windowClosing(WindowEvent e) {
//                // 可以在这里添加保存游戏数据等操作
//                System.exit(0);
//            }
//        });
//
//        // 创建按钮面板并将按钮添加进去
//        buttonPanel = new JPanel();
//        buttonPanel.setOpaque(false); // 设置为透明背景
//        buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); // 右对齐布局
//        buttonPanel.add(saveButton);
//        buttonPanel.add(loadButton);
//
//
//        // 创建保存按钮并设置相关属性和监听器
//        saveButton = new JButton("保存游戏");
//        saveButton.setFont(new Font("仿宋体", Font.BOLD, 24));
//        saveButton.setForeground(Color.WHITE);
//        saveButton.setBackground(Color.GRAY);
//        saveButton.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                gamePanel.saveGame("game_state.ser");
//            }
//        });
//
//        // 创建加载按钮并设置相关属性和监听器
//        loadButton = new JButton("加载游戏");
//        loadButton.setFont(new Font("仿宋体", Font.BOLD, 24));
//        loadButton.setForeground(Color.WHITE);
//        loadButton.setBackground(Color.GRAY);
//        loadButton.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                gamePanel.loadGame("game_state.ser");
//            }
//        });
//
//        // 将保存和加载按钮添加到按钮面板
//        buttonPanel.add(saveButton);
//        buttonPanel.add(loadButton);
//    }
//
//    // 开始游戏的方法，用于切换到游戏面板并启动游戏循环
//    public void startGame() {
//        // 隐藏当前窗口
//        setVisible(false);
//        // 将游戏面板设置为窗口的内容面板
//        setContentPane(gamePanel);
//        // 强制重新布局窗口内的组件
//        revalidate();
//        // 强制重绘窗口
//        repaint();
//        // 请求游戏面板获得键盘焦点
//        gamePanel.requestFocusInWindow();
//        // 启动游戏面板的游戏循环定时器
//        gamePanel.startGameLoop();
//        // 使窗口重新可见
//        setVisible(true);
//
//        setVisible(false);
//        setContentPane(gamePanel);
//
//        // 将按钮面板添加到游戏面板的底部
//        gamePanel.add(buttonPanel, BorderLayout.SOUTH);
//
//        revalidate();
//        repaint();
//        gamePanel.requestFocusInWindow();
//        gamePanel.startGameLoop();
//        setVisible(true);
//    }
//
//    // 游戏结束的方法，用于显示游戏结束信息并退出程序
//    public void gameOver(boolean isVictory) {
//        // 设置游戏结束标志为true
//        isGameOver = true;
//        // 根据游戏胜利与否设置相应的消息
//        String message = isVictory? "游戏结束，胜利！" : "游戏结束，失败！";
//        // 弹出消息对话框显示游戏结束信息
//        JOptionPane.showMessageDialog(this, message, "提示", JOptionPane.INFORMATION_MESSAGE);
//        // 退出程序
//        System.exit(0);
//    }
//
//    // 主函数，用于启动游戏，使用SwingUtilities确保在事件调度线程中创建和显示窗口
//    public static void main(String[] args) {
//        // 使用SwingUtilities确保在事件调度线程中创建和操作Swing组件
//        SwingUtilities.invokeLater(() -> {
//            new TankGame();
//        });
//    }
//}


package TankGame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TankGame extends JFrame {
    private JPanel startPanel;
    private GamePanel gamePanel;
    private boolean isGameOver;
    private JButton saveButton;
    private JButton loadButton;
    private JPanel buttonPanel; // 声明 buttonPanel ,用于保存和加载按钮的容器

    public TankGame() {
        setTitle("坦克大战");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);

        startPanel = new StartPanel(this);
        gamePanel = new GamePanel(this);
        isGameOver = false;

        setContentPane(startPanel);
        setVisible(true);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        // 创建保存按钮并设置相关属性和监听器
        saveButton = new JButton("保存游戏");
        saveButton.setFont(new Font("仿宋体", Font.BOLD, 24));
        saveButton.setForeground(Color.WHITE);
        saveButton.setBackground(Color.GRAY);
        saveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gamePanel.saveGame("game_state.ser");
            }
        });

        // 创建加载按钮并设置相关属性和监听器
        loadButton = new JButton("加载游戏");
        loadButton.setFont(new Font("仿宋体", Font.BOLD, 24));
        loadButton.setForeground(Color.WHITE);
        loadButton.setBackground(Color.GRAY);
        loadButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gamePanel.loadGame("game_state.ser");
            }
        });

        // 创建按钮面板并将按钮添加进去
        buttonPanel = new JPanel();
        buttonPanel.setOpaque(false); // 设置为透明背景
        buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); // 右对齐布局
        buttonPanel.add(saveButton);
        buttonPanel.add(loadButton);
    }

    public void startGame() {
        setVisible(false);
        setContentPane(gamePanel);

        // 将按钮面板添加到游戏面板的底部
        gamePanel.add(buttonPanel, BorderLayout.SOUTH);

        revalidate();
        repaint();
        gamePanel.requestFocusInWindow();
        gamePanel.startGameLoop();
        setVisible(true);
    }

    public void gameOver(boolean isVictory) {
        isGameOver = true;
        String message = isVictory ? "游戏结束，胜利！" : "游戏结束，失败！";
        JOptionPane.showMessageDialog(this, message, "提示", JOptionPane.INFORMATION_MESSAGE);
        System.exit(0);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new TankGame();
        });
    }
}



